#pragma once

#include "fxcc/core/Base.h"
#include "fxcc/core/MetaCache.h"
#include "fxcc/mono/Behivor.h"
#include "fxcc/mono/Clazz.h"
#include "fxcc/core/MetaCache.h"

namespace mono
{
	struct MonoBehivorMap :public fxcc::Base
	{
		MetaMapIndex m_Index;

		std::shared_ptr<mono::Behivor> m_Behivor;
		
		std::shared_ptr<mono::Clazz> m_Clazz;

		std::shared_ptr<mono::Object> m_Object;

		bool OnLoad();

		MonoObject* GetObject() const
		{
			return m_Object ? m_Object->object : 0;
		}

		MonoClass* GetClass() const
		{
			return m_Clazz ? m_Clazz->klass : 0;
		}
		bool Avail() const
		{
			if (!m_Clazz)
			{
				return false;
			}
			if (!m_Object)
			{
				return false;
			}
			if (!GetClass())
			{
				return false;
			}
			if (!GetObject())
			{
				return false;
			}
			return true;
		}
		bool Invoke(const std::string& methodName, int numParams,const mono::Args& args)
		{
			if (!m_Clazz)
			{
				return false;
			}

			if (!m_Object)
			{
				return false;
			}
			mono::Method::Desc desc;
			desc.m_Name = methodName;
			desc.m_NumParam = numParams;
			auto method = m_Clazz->GetMethod(desc);
			if (!method.get())
			{
				return false;
			}
			return m_Object->Invoke(method.get(), args);

		}
	};
}
